package persistence.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;

import persistence.model.Personne;
import persistence.model.Tache;
import util.HibernateUtil;

/**
 * @author Florent
 * 
 */
public class PersonneDAO {
	/**
	 * La prŽsence d'un constructeur privŽ supprime le constructeur public par
	 * dŽfaut.
	 */
	private PersonneDAO() {

	}

	/**
	 * 
	 */
	private static PersonneDAO INSTANCE = null;

	/**
	 * Le mot-clŽ synchronized sur la mŽthode de crŽation emp�che toute
	 * instanciation multiple m�me par diffŽrents threads. Retourne l'instance
	 * du singleton.
	 */
	public synchronized static PersonneDAO getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new PersonneDAO();
		}
		return INSTANCE;
	}

	/**
	 * @param login
	 * @return
	 */
	public Personne getPersonneFromLogin(final String login) {
		Personne personne = new Personne();
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		session.beginTransaction();
		personne = (Personne) session
				.createQuery("from Personne where loginPersonne=:login")
				.setString("login", login).uniqueResult();
		session.getTransaction().commit();
		return personne;
	}

	/**
	 * @param id
	 * @return
	 */
	public Personne getPersonneFromId(final Long id) {
		Personne personne = new Personne();
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		session.beginTransaction();
		personne = (Personne) session
				.createQuery("from Personne where idPersonne=:id")
				.setLong("id", id).uniqueResult();
		session.getTransaction().commit();
		return personne;
	}

	/**
	 * @param personne
	 * @return
	 */
	public Personne createUser(final Personne personne) {
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		session.beginTransaction();
		session.save(personne);
		session.getTransaction().commit();
		return personne;
	}

	/**
	 * @param personne
	 * @return
	 */
	public Personne updateUser(final Personne personne) {
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		session.beginTransaction();
		session.update(personne);
		session.getTransaction().commit();
		return personne;
	}

	/**
	 * @return
	 */
	public List<Personne> fetchPersonnes() {
		List<Personne> personnes = new ArrayList<Personne>();
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		session.beginTransaction();
		personnes = (ArrayList<Personne>) session.createQuery(
				"from Personne where idPersonne != 0").list();
		session.getTransaction().commit();
		return personnes;
	}

	/**
	 * @param personne
	 */
	public void deleteUser(final Personne personne) {
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		session.beginTransaction();
		session.delete(personne);
		session.getTransaction().commit();
	}

	public void addTache(Personne personne, Tache tache) {
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		session.beginTransaction();
		personne = (Personne) session.get(Personne.class,
				personne.getIdPersonne());
		tache = (Tache) session.get(Tache.class, tache.getIdTache());
		personne.addTache(tache);
		session.update(personne);
		session.getTransaction().commit();

	}

	public void removeTache(Personne personne, Tache tache) {
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		session.beginTransaction();
		personne = (Personne) session.get(Personne.class,
				personne.getIdPersonne());
		tache = (Tache) session.get(Tache.class, tache.getIdTache());
		personne.removeTache(tache);
		session.update(personne);
		session.getTransaction().commit();

	}

}
